home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib43 / mntlib / div.c < prev    next >
C/C++ Source or Header  |  1993-09-15  |  1KB  |  77 lines

  1. /*
  2.  * div and ldiv
  3.  *    this one should be compat with -fpcc-struct-return
  4.  *
  5.  *    ++jrb    bammi@dsrgsun.ces.cwru.edu
  6.  */
  7. #include <stdlib.h>
  8.  
  9. #ifdef __GNUC__
  10.  
  11. long __divsi3(long, long);    /* returns: quot in d0.l  remainder in d1.l */
  12.  
  13. #ifdef __MSHORT__
  14. div_t div(int num, int denom)
  15. {
  16.     div_t     result;
  17.  
  18.     __asm__ volatile("\
  19.         divs    %4,%3    | %3/%2 must be a data reggie
  20.         movw    %2,%0    | %2<31:16> == rem    %2<15:0> == quot
  21.         swap    %2
  22.         movw    %2,%1"
  23.         : "=g"(result.quot), "=g"(result.rem), "=d"((long)num)
  24.         : "2"((long)num), "d"(denom)
  25.         );
  26.  
  27.     return result;
  28. }
  29. #else /* !__MSHORT__ */
  30. __asm__(".stabs \"_div\",5,0,0,_ldiv");
  31. #endif
  32.  
  33. ldiv_t ldiv(long num, long denom)
  34. {
  35.     ldiv_t    result;
  36.  
  37.     __asm__ volatile("\
  38.          movl    %3,sp@-
  39.         movl    %2,sp@-
  40.         jsr    ___divsi3
  41.         addqw    #8,sp
  42.         movl    d0,%0
  43.         movl    d1,%1"
  44.         : "=g"(result.quot), "=g"(result.rem)
  45.         : "r"(num), "r"(denom)
  46.         ); /* compiler dependency, dont tell gcc about d0,d1 clobb */
  47.     return result;
  48. }
  49.  
  50. #else /* !__GNUC__ */
  51.  
  52. div_t
  53. div(num, denom)
  54. int num, denom;
  55. {
  56.     div_t res;
  57.     
  58.     res.quot = num / denom;
  59.     res.rem = num % denom;
  60.     
  61.     return res;
  62. }
  63.  
  64. ldiv_t
  65. ldiv(num, denom)
  66. long num, denom;
  67. {
  68.     ldiv_t res;
  69.     
  70.     res.quot = num / denom;
  71.     res.rem = num % denom;
  72.     
  73.     return res;
  74. }
  75.  
  76. #endif /* !__GNUC__ */
  77.